/**
 * core/cozeClient.js
 * 封装 Coze API 客户端及其工作流相关调用方法。
 */

const axios = require('axios');
const { CozeAPI } = require('@coze/api');
const config = require('../config');
const { buildApiErrorMessage } = require('../utils/errorHandler');
const { getWorkflowParametersToCoze } = require('./workflowService')

// 初始化 Coze 客户端
// const apiClient = new CozeAPI({
//   token: config.api.token,
//   baseURL: config.api.baseUrl
// });

// 根据 taskType，判断用哪个号来执行
function getCozeClient(taskType) {
  const token = config.api.token[taskType] || config.api.token['默认'];  // 根据 taskType 获取对应 token
  if (!token) {
    throw new Error(`未找到对应 taskType 的 token: ${taskType}`);
  }

  return new CozeAPI({
    token: token,
    baseURL: config.api.baseUrl
  });
}

/**
 * 提交 Coze Workflow 异步执行任务
 * @param {string} workflowId - 工作流 ID
 * @param {object} parameters - 工作流参数
 * @param {string} taskType - 任务类型（用于参数转换）
 * @returns {Promise<object>} { execute_id, code, msg, debug_url }
 */
async function submitWorkflow(workflowId, parameters, taskType) {
  try {
    console.log('🚀 调用 Coze 工作流:', { workflowId, taskType });

    //将参数转换到对应的工作流参数类型和数量
    const coze_parameters = getWorkflowParametersToCoze(taskType, parameters);

    // 通过 taskType 来选择使用哪个用户来执行 工作流
    const apiClient = getCozeClient(taskType);

    const response = await apiClient.workflows.runs.create({
      workflow_id: workflowId,
      parameters: coze_parameters,
      is_async: true
    });

    const executeId = response.data?.execute_id || response.execute_id;
    return {
      execute_id: executeId,
      code: response.code,
      msg: response.msg,
      debug_url: response.debug_url
    };
  } catch (error) {
    console.error('❌ submitWorkflow 调用 Coze API 失败:', error);
    throw new Error(buildApiErrorMessage(error, 'Coze'));
  }
}

/**
 * 查询工作流异步执行结果（根据 executeId 和 workflowId）
 * @param {string} executeId
 * @param {string} workflowId
 * @param {string} taskType - 任务类型（用于获取 token）
 * @returns {Promise<object>} Coze API 返回数据
 */
async function queryWorkflowResult(executeId, workflowId, taskType) {
  try {
    const url = `https://api.coze.cn/v1/workflows/${workflowId}/run_histories/${executeId}`;
    const access_token = config.api.token[taskType] || config.api.token['默认']; // 根据 taskType 获取对应的 coze 授权码
    const response = await axios.get(url, {
      headers: {
        Authorization: `Bearer ${access_token}`,
        'Content-Type': 'application/json'
      },
      timeout: 10000
    });
    return response.data;
  } catch (error) {
    console.error(`❌ 查询任务 ${executeId} 状态出错:`, error);
    throw new Error(buildApiErrorMessage(error, 'Coze'));
  }
}

/**
 * 运行视频渲染工作流
 * @param {string} url - 视频渲染所需的资源地址
 * @returns {Promise<object>} - Coze 工作流执行信息
 */
async function runRenderWorkflow(url) {
  try {
    if (!url) {
      throw new Error('云渲染视频 需要提供有效的 darft_url 参数');
    }

    // 你可以在 config 中维护视频渲染工作流的 ID
    const renderWorkflowId = '7563522028675317799';
    const renderTaskType = '云渲染';  // 使用云渲染 taskType

    const parameters = { url };

    return await submitWorkflow(renderWorkflowId, parameters, renderTaskType);
    
  } catch (error) {
    console.error('❌ runRenderWorkflow 调用失败:', error);
    throw new Error(buildApiErrorMessage(error, 'Coze'));
  }
}


module.exports = {
  submitWorkflow,
  queryWorkflowResult,
  runRenderWorkflow
};